from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import List, Optional

mcp = FastMCP("Python-Gitlab MCP Server")

"""
面向软件：python-gitlab
所有 MCP tool 列表：

1. gitlab_version
   - 用途：获取 python-gitlab 版本信息
   - 参数：无
   - 返回：统一 JSON 结构

2. gitlab_user_list
   - 用途：查询 GitLab 用户列表，支持多种配置和输出选项
   - 参数：
     * config_file: 配置文件路径
     * verbose: 是否显示详细信息（-v/--verbose）
     * fancy: 是否使用花式输出（--fancy）
     * debug: 是否启用调试模式（-d/--debug）
     * gitlab_instance: GitLab 实例名称（-g/--gitlab）
     * output_format: 输出格式（-o/--output，如 json、yaml、legacy）
     * fields: 指定输出字段（-f/--fields）
   - 返回：统一 JSON 结构

3. gitlab_help
   - 用途：显示 gitlab 命令的使用帮助
   - 参数：无
   - 返回：统一 JSON 结构
"""

@mcp.tool()
def gitlab_version(ctx: Context) -> dict:
    """获取 python-gitlab 版本信息
    
    返回：
        dict: 包含命令执行结果的统一 JSON 结构
    """
    try:
        result = subprocess.run(
            ["gitlab", "--version"],
            capture_output=True,
            text=True,
            timeout=30
        )
        return {
            "success": result.returncode == 0,
            "command": "gitlab --version",
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "gitlab --version",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def gitlab_user_list(
    ctx: Context,
    config_file: str,
    verbose: bool = False,
    fancy: bool = False,
    debug: bool = False,
    gitlab_instance: Optional[str] = None,
    output_format: Optional[str] = None,
    fields: Optional[str] = None
) -> dict:
    """查询 GitLab 用户列表
    
    参数：
        config_file: 配置文件路径
        verbose: 是否显示详细信息
        fancy: 是否使用花式输出
        debug: 是否启用调试模式
        gitlab_instance: GitLab 实例名称
        output_format: 输出格式（json、yaml、legacy）
        fields: 指定输出字段
    
    返回：
        dict: 包含命令执行结果的统一 JSON 结构
    """
    try:
        cmd = ["gitlab"]
        
        # 添加选项参数
        if verbose:
            cmd.append("-v")
        if fancy:
            cmd.append("--fancy")
        if debug:
            cmd.append("-d")
        if gitlab_instance:
            cmd.extend(["-g", gitlab_instance])
        if output_format:
            cmd.extend(["-o", output_format])
        if fields:
            cmd.extend(["-f", fields])
        
        # 添加配置文件和命令
        cmd.extend(["-c", config_file, "user", "list"])
        
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            timeout=30
        )
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(cmd),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "gitlab user list",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def gitlab_help(ctx: Context) -> dict:
    """显示 gitlab 命令的使用帮助
    
    返回：
        dict: 包含命令执行结果的统一 JSON 结构
    """
    try:
        result = subprocess.run(
            ["gitlab", "--help"],
            capture_output=True,
            text=True,
            timeout=30
        )
        return {
            "success": result.returncode == 0,
            "command": "gitlab --help",
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "gitlab --help",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()